#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define SIZE 10
 
 //列子一：
/*
int main() {
    //算1！+2！+3！+...+n!的结果
	int n = 0;
	scanf("%d", &n); //3
	//1!+2！+3！
	//1  2   6  =9
	int i = 0;
	int ret = 1;
	int sum = 0;
	int j = 0;
	for ( j= 1; i <=n; j++)s
	{
        // int ret应该第一个for里面，不然保留的都是上一次
        ret=1;
		for (i = 1; i <= j; i++)  //在这 打一个 条件断点为 i=3  
        // 再F10 逐步运行  看监视窗口中 变量的值
		{
			ret *= i; //在算3的阶乘的时候 出错 不知道原因 
		}
		sum += ret;
	}
	
	
	printf("%d\n", sum);
    // 结果不是9  算成15
    // 结果错误  就是运行时错误！
    //  调试解决的就是运行时错误！

	return 0;
} 
 */

//  解决问题：
// 1.首先推测问题出现的原因。初步确定问题可能的原因最好。
// 2.实际上手调试很有必要
// 3.调试的时候我们心里有数
// 应该是什么结果-预期
// 调试的时候发现不符合预期
// 就找到问题了！

//列子二：
int main() {
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//0-9
	for ( i = 0; i <=12; i++)
	{
		arr[i] = 0;
		printf("hehe\n");
	}
	//代码运行的结果是什么？
	// 直接死循环 ?
	// 
	// 
	//因为这里i = 12时 & i = &arr[i], 相当于i被赋值为0
	// 
	// 1.i和arr是局部变量
	//	局部变量是放在栈区上的 (在此代码中先创建了i 后创建arr)
	//	栈区内存的使用习惯是：
	//	先使用高地址空间，再使用低地址空间
	// 在栈区是从上往下创建变量相当于叠加扔盘子，读取arr时后面就是i了
	//
	//  2.数组随着下标的增长地址
	//是由低到高变化的
	// 
	// 所以数组如果用下标来访问的时候,只要适当的往后越界,就有可能覆盖到i，而i如果可能被覆盖的话,就可能会导致程序的死循环
	// 
	//临时变量进栈，i先进，数组后进，两个变量有可能连续，
	//有可能不连续（多线程，可能有其他程序也有变量入栈），但也不会相差太远
	return 0;
} 
 